package com.regent.central.bill.repository;

import com.regent.central.bill.common.ActionType;
import com.regent.central.bill.core.ModifyGoods;
import com.regent.central.bill.dto.sale_order.SaleOrderDetailModifyGoodsDTO;
import com.regent.central.bill.dto.sale_order.SaleOrderDetailModifyOrderDTO;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import tk.mybatis.mapper.common.Mapper;

import java.math.BigDecimal;
import java.util.List;

@Repository
public interface ModifyGoodsMapper extends Mapper<ModifyGoods> {

    /**
     * 获取指定销售单的改他单总额
     *
     * @param saleOrderId 销售单ID
     * @return 该销售单的改他单总额
     */
    BigDecimal getModifyThatGoodsAmount(
            @Param("saleOrderId") String saleOrderId
    );

    /**
     * 获取指定销售单的改他单总数
     *
     * @param saleOrderId 销售单ID
     * @return 该销售单的改他单总数
     */
    BigDecimal getModifyThatGoodsTotal(
            @Param("saleOrderId") String saleOrderId
    );

    /**
     * 获取指定销售单的改他单增加总数
     *
     * @param saleOrderId 销售单ID
     * @return 该销售单的改他单增加总数
     */
    BigDecimal getModifyThatGoodsTotalInc(
            @Param("saleOrderId") String saleOrderId
    );

    /**
     * 获取指定销售单的改他单减少总数
     *
     * @param saleOrderId 销售单ID
     * @return 该销售单的改他单减少总数
     */
    BigDecimal getModifyThatGoodsTotalDec(
            @Param("saleOrderId") String saleOrderId
    );

    /**
     * 获取指定销售单的改本单总数
     *
     * @param saleOrderId 销售单ID
     * @return 该销售单的改本单总数
     */
    BigDecimal getModifyThisGoodsTotal(
            @Param("saleOrderId") String saleOrderId
    );

    /**
     * 获取销售单详情改他单销售单列表
     *
     * @param saleOrderId 本销售单ID
     * @return 销售单详情改他单销售单列表
     */
    List<SaleOrderDetailModifyOrderDTO> getSaleOrderDetailModifyThatOrders(
            @Param("saleOrderId") String saleOrderId
    );

    /**
     * 获取销售单详情改他单货品列表
     *
     * @param saleOrderId 销售单ID
     * @return 销售单详情改他单货品列表
     */
    List<SaleOrderDetailModifyGoodsDTO> getSaleOrderDetailModifyThatGoods(
            @Param("saleOrderId") String saleOrderId
    );

    /**
     * 获取销售单详情改本单销售单及货品列表
     *
     * @param saleOrderId 本销售单ID
     * @return 销售单详情改本单销售单及货品列表
     */
    List<SaleOrderDetailModifyOrderDTO> getSaleOrderDetailModifyThisOrders(
            @Param("saleOrderId") String saleOrderId
    );

    /**
     * 获取销售单详情被改欠货货品列表
     *
     * @param saleOrderId 销售单ID
     * @return 销售单详情被改欠货货品列表
     */
    List<SaleOrderDetailModifyGoodsDTO> getSaleOrderDetailModifyThisGoods(
            @Param("saleOrderId") String saleOrderId
    );

    /**
     * 删除改单货品
     *
     * @param modifyGoodsId 改单货品ID
     * @param userDeleted   删除人
     * @param timeDeleted   删除时间
     */
    void hide(
            @Param("modifyGoodsId") String modifyGoodsId,
            @Param("userDeleted") String userDeleted,
            @Param("timeDeleted") long timeDeleted
    );

    /**
     * 根据改单动作ID删除改单货品
     *
     * @param modifyActionId 改单动作ID
     * @param userDeleted    删除人
     */
    void deleteForSaleOrderModifyAction(
            @Param("modifyActionId") String modifyActionId,
            @Param("userDeleted") String userDeleted,
            @Param("timeDeleted") long timeDeleted
    );

    /**
     * /**
     * 获取销售单的改欠货/被改欠货货品
     *
     * @param saleOrderId 销售单ID
     * @param actionType  改签或类型
     * @param canceled    已撤销
     * @param deleted     已删除
     * @return 销售单的改欠货/被改欠货货品
     */
    List<ModifyGoods> getSaleOrderModifyGoods(
            @Param("saleOrderId") String saleOrderId,
            @Param("actionType") ActionType actionType,
            @Param("canceled") Boolean canceled,
            @Param("deleted") Boolean deleted
    );

    /**
     * 获取销售单父动作的改欠货/被改欠货货品列表
     *
     * @param parentActionId 父动作ID
     * @param canceled       已撤销
     * @param deleted        已删除
     * @return 销售单父动作的改欠货/被改欠货货品列表
     */
    List<ModifyGoods> getSaleOrderModifyGoodsOfParent(
            @Param("parentActionId") String parentActionId,
            @Param("canceled") Boolean canceled,
            @Param("deleted") Boolean deleted
    );

}